package com.xiaoyushu.user.relation.biz.exception;

import com.xiaoyushu.framework.common.exception.BizException;
import com.xiaoyushu.framework.common.response.Response;
import com.xiaoyushu.user.relation.biz.enums.ResponseCodeEnum;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Optional;

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    @ExceptionHandler({BizException.class})
    @ResponseBody
    public Response<Object> handleBizException(HttpServletRequest request,BizException e) {
        log.warn("{} request fail, errorCode: {}, errorMessage: {}", request.getRequestURI(), e.getErrorCode(), e.getMessage());
        return Response.fail(e);
    }

    /**
     * 捕获参数校验异常
     * @param request
     * @param e
     * @return
     */

    @ExceptionHandler({MethodArgumentNotValidException.class})
    @ResponseBody
    public Response<Object> HandleMethodArgumentNotValidException(HttpServletRequest request,MethodArgumentNotValidException e) {
        log.warn("{} request fail, errorCode: {}, errorMessage: {}", request.getRequestURI(), e.getMessage());
        //参数错误异常码
        String errorCode= ResponseCodeEnum.PARAM_NOT_VALID.getErrorCode();
        //获取BindingResult
        BindingResult bindingResult = e.getBindingResult();

        StringBuilder sb = new StringBuilder();
        //获取校验不通过的字段，并组合错误信息，格式为：email 邮箱格式不正确，当前值: '123124qq.com';
        Optional.ofNullable(bindingResult.getFieldErrors()).ifPresent(errors -> {
            errors.forEach(error ->
                    sb.append(error.getField())
                            .append(" ")
                            .append(error.getDefaultMessage())
                            .append(",当前值:'")
                            .append(error.getRejectedValue())
                            .append("';")
            );
        });
        //错误信息
        String errorMessage = sb.toString();
        log.warn("{} request error, errorCode: {}, errorMessage: {}", request.getRequestURI(), errorCode, errorMessage);
        return Response.fail(errorCode,errorMessage);
    }

    /**
     * 捕获guava 参数校验异常
     * @param request
     * @param e
     * @return
     */
    public Response<Object> handleIllegalArgumentException(HttpServletRequest request,IllegalArgumentException e) {
        //参数 错误异常码
        String errorCode = ResponseCodeEnum.PARAM_NOT_VALID.getErrorCode();
        //错误信息
        String errorMessage=e.getMessage();
        log.warn("{} request fail, errorCode: {}, errorMessage: {}", request.getRequestURI(), ResponseCodeEnum.SYSTEM_ERROR.getErrorCode(), e.getMessage());
        return Response.fail(errorCode,errorMessage);
    }

    /**
     * 其他类型异常
     * @param request
     * @param e
     * @return
     */
    @ExceptionHandler({Exception.class})
    @ResponseBody
    public Response<Object> handleOtherException(HttpServletRequest request,Exception e){
        log.error("{} request error, ", request.getRequestURI(), e);
        return Response.fail(ResponseCodeEnum.SYSTEM_ERROR.getErrorMessage());
    }
}
